// 1. 方法的形参默认值
// ES5 的形参默认值
function argDefault(a) {
    a = a || "默认值";
    console.log(a)
}
argDefault(100)
argDefault()
argDefault(0)
argDefault("")
argDefault(null)

console.log("------------------")

function argDefault2(a) {
    // a = a==null?"默认值":a;
    a = a===undefined?"默认值":a;
    console.log(a)
}
argDefault2(100)
argDefault2()
argDefault2(0)
argDefault2("")
argDefault2(null)

console.log("------------------")

// ES6 通过提供形参赋值语法,构建默认值
//  语法  function 方法名( 形参名="默认值",... ){}
//       只有当参数未传递或传递值为 undefined 时会使用默认值
function argDefault3( a="默认值" ) {
    console.log(a)
}
argDefault3(100)
argDefault3()
argDefault3(0)
argDefault3("")
argDefault3(null)

console.log("------------------")
function argDefault4( a="默认值1",b="默认值2",c="默认值3" ) {
    console.log(a,b,c)
}
argDefault4(100,200);


// 2. 方法的形参计算
function argCalc1( a,b=1+1,c=a+1,d=a+b ) {
    console.log(a,b,c,d)
}
argCalc1(10);

console.log("------------------------")
// 3. 回调方法参数  =>  方法回调: 将方法A作为参数传递给方法B,在方法B执行过程中调用方法A
function callbackArg() {
    console.log("callbackArg")
    return 100;
}
function callbackFun(a){
    console.log("参数a:",typeof a,a)
    if(typeof(a)==="function"){
        a(); // 方法回调
    }
}
// JS中因为方法也可以被理解为一个特殊数据类型的变量值
//  所以方法也可以作为参数进行传递
// let temp = callbackArg();
// callbackFun( temp );
callbackFun( callbackArg() ) // 传递方法返回值
console.log("***********")
callbackFun( callbackArg ) // 方法体传递

console.log("***********")
// 4. 匿名方法参数
callbackFun( function (){
    console.log("匿名回调方法")
} )

// 回调的嵌套导致的回调地狱
// callbackFun( function (){
//     callbackFun(function (){
//         callbackFun(function (){
//             callbackFun(function (){
//                 callbackFun(function (){
//
//                 })
//             })
//         })
//     })
// } )







